Eine Kurve ordnet jedem Parameterwert genau einen Punkt zu:
Läuft von bis , fährt der Punkt die Kurve einmal ab. Die grauen Punkte liegen in gleichen Schritten von .
Tangentenvektor = Ableitung, zeigt in die Laufrichtung:
Bogenlänge = tatsächlich zurückgelegter Weg:
Die Länge von ist eine „Geschwindigkeit“ im Parameterraum – sie hängt von der Parametrisierung ab, nicht von der Form.
Die Krümmung misst, wie stark sich die Tangentenrichtung pro Weglänge dreht:
ell = cf.ellipse(30.0, 15.0) # Halbachsen 30 und 15 mm
Entlang der Ellipse ändert sich die Krümmung. Ihr größter und ihr kleinster Wert:
Sagen Sie zuerst voraus: Wo auf der Ellipse liegt welcher Wert? Wie groß sind die Krümmungsradien dort?
print(ell.curvatureAt(0.0), ell.curvatureAt(0.25))
# 0.133 0.0167
Allgemein gilt an den Scheiteln einer Ellipse mit Halbachsen : (spitz) und (flach).
Warum liegt genau am flachen Scheitel? Das klärt die nächste Folie.
Der Parameter läuft gleichmäßig – die Punkte auf der Kurve liegen es nicht (oben). Gleiche Wege liefert erst die Bogenlänge (unten).
positionAt(t), tangentAt(t), curvatureAt(t) – CadQuery-Standard mode="length": ist der Bruchteil der Bogenlänge. Ein Viertel des Umfangs endet aus Symmetriegründen am flachen Scheitel.mode="parameter": ist der Kurvenparameter , wie OCCT ihn speichert – bei Kreis und Ellipse läuft er von 0 bis .linie = cf.segment((0, 0, 0), (50, 0, 0))
print(linie.paramAt(0), linie.paramAt(1)) # 0.0 50.0
| Kante | Rohparameter in OCCT |
|---|---|
| Linie der Länge | |
| Kreis, Ellipse (geschlossen) | |
| Bogen, z. B. Eckenrundung | Teilstück, z. B. |
| Spline | je nach Aufbau, z. B. |
e.paramAt(d) einen Bruchteil der Bogenlänge in ume.startPoint() liegt bei Ein Versatz (Offset) verschiebt jeden Punkt einer Kurve um entlang ihrer Normalen.
kreis = cf.circle(10.0)
ell = cf.ellipse(20.0, 10.0)
v_kreis = cf.offset2D(cf.wire(kreis), 3.0)
v_ell = cf.offset2D(cf.wire(ell), 3.0)
Der Kreis wird ein Kreis mit .
Und die Ellipse? Wird sie eine Ellipse mit den Halbachsen 23 und 13? Prüfen Sie es über die Krümmungsradien an den Scheiteln.
Tipp: In der Nähe eines Punktes verhält sich jede Kurve wie ihr Krümmungskreis.
print([e.geomType() for e in v_kreis.Edges()]) # ['CIRCLE']
print([e.geomType() for e in v_ell.Edges()]) # ['OFFSET', 'OFFSET', 'OFFSET', 'OFFSET']
OFFSET
Konstante Krümmung (Kreis) → Versatz bleibt Kreis. Variable Krümmung (Ellipse) → etwas Neues, das keine analytische Formel mehr trägt.
CAD-Systeme brauchen eine Darstellung für beliebige glatte Kurven: Bézier, B-Spline, NURBS.
Nehmen Sie Ihre Grundplatte (mit Bohrungen und Zapfen) und gehen Sie ihre Kanten durch.
geomType-Werte kommen vor?Hinweise: for e in grundplatte.Edges():, grundplatte.edges("%CIRCLE").Edges(), e.geomType(), e.radius()
import math
ell = cf.ellipse(30.0, 15.0)
ell.positionAt(i / 8) für i von 0 bis 8. Berechnen Sie die Abstände benachbarter Punkte.ell.positionAt(i * 2 * math.pi / 8, mode="parameter").ell.tangentAt(0.25)? In welcher Richtung läuft die Ellipse also um?Hinweise: for i in range(9):, Punkte in einer Liste sammeln; Abstand zweier Punkte: (p2 - p1).Length
Die Außenkontur Ihrer Grundplatte hat Ecken mit r = 6 mm. So holen Sie sie heraus:
kontur = grundplatte.faces("<Z").outerWire()
cf.offset2D(kontur, d) und den Radien der Kreiskanten.Hinweise: .edges("%CIRCLE").Edges(), e.radius(), .Edges(), e.geomType()
Versetzen Sie die Ellipse aus Aufgabe 6 (Halbachsen 30 und 15) nach innen, also mit negativem d.
d kann der Versatz nicht mehr glatt sein? Begründen Sie es mit den Krümmungsradien.geomType-Werte kommen heraus, wie viele Kanten?Hinweise: cf.offset2D(cf.wire(ell), d), .Edges(), e.geomType()
curvatureAt abtasten und über plottenw04/ committet und gepusht